package com.skiving.cloud.workflow.service;

import com.mybatisflex.core.paginate.Page;
import com.skiving.cloud.auth.entity.AuthUser;
import com.skiving.cloud.common.utils.PageParameter;
import com.skiving.cloud.workflow.api.TaskParam;
import com.skiving.cloud.workflow.entity.ProcessVo;
import com.skiving.cloud.workflow.entity.TaskVo;

import java.io.IOException;
import java.text.ParseException;
import java.util.List;
import java.util.Map;

/**
 * @author hushouquan
 * @since 2024/3/13
 */
public interface LovelyProcessService{
    
    /**
     * 流程提交方法
     * @param taskParam 流程参数
     */
    String submitTask(TaskParam taskParam);
    
    /**
     * 分页查询待办任务
     * @param parameter 参数
     * @param userId 用户id
     * @return 待办任务
     */
    Page<TaskVo> getTodoListByPage(PageParameter<Map<String, Object>> parameter, String userId);
    
    /**
     * 分页查询我发起的流程
     * @param parameter 参数
     * @param userId 用户id
     * @return 流程
     */
    Page<ProcessVo> getCreateListByPage(PageParameter<Map<String, Object>> parameter, String userId);
    
    /**
     * 分页查询我参与的流程
     *
     * @param parameter 参数
     * @param user 用户
     * @return 流程
     */
    Page<ProcessVo> getPartakeListByPage(PageParameter<Map<String, Object>> parameter, AuthUser user);
    
    /**
     * 根据id查询流程审批历史记录
     * @param processId 流程实例ID
     * @return 审批记录
     */
    List<TaskVo> getHisTaskByProcessId(String processId);
    
    /**
     * 根据任务id查询可退回节点
     * @param taskId 任务ID
     * @return 已经审批的节点记录
     */
    List<TaskVo> getRetractNodeByTaskId(String taskId);
    
    /**
     * 终止流程
     * @param params 流程参数
     */
    void deleteProcess(Map<String, Object> params);
    
    /**
     * 根据流程实例id获取流程文件xml及高亮
     * @param id 流程实例id
     * @return 流程文件xml及高亮
     */
    Map<String, Object> getResourceAndStateByProcessId(String id) throws IOException;
    
    /**
     *
     * 检入检出流程任务
     * @param taskId 任务ID
     * @param sign 检入/检出 WorkflowConstants.TaskSign
     * @param userId 用户id
     */
    void doClaimTask(String taskId, String sign, String userId);
    
    /**
     * 发起人撤回流程
     * @param processId 流程实例ID
     */
    void recallTaskByStarter(String processId);
    
    /**
     * 获取可撤回节点
     * @param processId 流程实例ID
     * @param userId 用户id
     * @return 可撤回节点
     */
    List<TaskVo> getCanRecallTask(String processId, String userId);
    
    /**
     * 任意撤回流程，选择一个节点撤回
     * @param params 参数
     * @param userId 撤回的用户id
     */
    void recallTaskAny(Map<String, Object> params, String userId);
    
    /**
     * 流程驳回
     * @param params 参数
     * @param userId 用户id
     */
    void submitRetract(Map<String, Object> params, String userId);
    
    /**
     * 流程管理分页查询
     * @param parameter 查询参数
     * @return 分页结果
     */
    Page<ProcessVo> queryProcessPage(PageParameter<ProcessVo> parameter) throws ParseException;
    
    /**
     * 挂起或恢复流程
     * @param processId 流程实例ID
     * @param state 状态
     */
    void suspendOrActiveProcess(String processId, String state);
    
    /**
     * 流程转办
     * @param taskId 流程任务ID
     * @param userId 用户ID
     */
    void transferProcess(String taskId, String userId);
}
